package com.zy.batiya.shiro;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.shiro.config.Ini;
import org.apache.shiro.config.Ini.Section;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**
 * 自定义url规则
 * */
public class CustomChainDefinitionSection implements FactoryBean<Ini.Section>{

	private String filterChainDefinitions;  
	
//	@Autowired
//	private ResourceMapper resourceMapper;
	
    public Section getObject() throws BeansException {  
  
        Ini ini = new Ini();  
        //加载默认的url  
        ini.load(filterChainDefinitions);  
        Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);  
        //循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,  
        //里面的键就是链接URL,值就是存在什么条件才能访问该链接
//       	Map<String,String> sectionMap = parseResource();
//       	section.putAll(sectionMap);
       	section.put("/**","authc");
        return section;  
    }

//    private Map<String,String> parseResource(){
//    	Map<String,String> resultMap = new HashMap<String,String>();
//    	Map<String,Resource> map = new HashMap<String,Resource>();
//    	List<Resource> list = resourceMapper.getResource();
//    	for(Resource obj:list){
//    		String url = obj.getPermission_url();
//    		Resource source = map.get(url);
//    		if(source==null){
//    			String role = obj.getRole_name();
//    			String permission = obj.getPermission_name();
//    			if(permission != null){
//    				obj.setPermission_name(role+":"+permission);
//    			}
//    			map.put(url,obj);
//    			continue;
//    		}
//    		String sourceRole = source.getRole_name();
//    		String sourcePermission = source.getPermission_name();
//    		String objRole = obj.getRole_name();
//    		String objPermission = obj.getPermission_name();
//    		if(objRole!=null){
//    			if(sourceRole!=null){
//    				source.setHasMoreRole(true);
//    				if(isAdd(sourceRole,objRole))
//    					source.setRole_name(sourceRole+","+objRole);
//    			}else{
//    				source.setRole_name(objRole);
//    			}
//    		}
//    		if(objPermission != null){
//    			if(sourcePermission != null){
//    				source.setHasMorePermission(true);
//    				String tmp = objRole+":"+objPermission;
//    				if(isAdd(sourcePermission,tmp))
//    					source.setPermission_name(sourcePermission+","+tmp);
//    			}else{
//    				source.setPermission_name(objRole+":"+objPermission);
//    			}
//    		}
//    	}
//    	for (String key : map.keySet()) {
//    			Resource o = map.get(key);
//    			String v = resourceToString(o);
//    			resultMap.put(key,v);
//    		}
//    	return resultMap;
//    }
//    
//    private boolean isAdd(String str,String str_){
//    	String [] arr = str.split(",");
//    	for(String s : arr){
//    		if(s.equals(str_)){
//    			return false;
//    		}
//    	}
//    	return true;
//    }
//    
//    private String resourceToString(Resource obj){
//    	//authc,
//    	String res = "";
//    	String role = obj.getRole_name();
//    	String permission = obj.getPermission_name();
//    	if(role!=null){
//    		res = obj.isHasMoreRole()?res +"roles[\""+role+"\"]":res +"roles["+role+"]";
//    	}
//    	if(permission != null && !"".equals(res)){
//    		res = obj.isHasMorePermission()?res +",perms[\""+permission+"\"]":res +",perms["+permission+"]";
//    	}else{
//    		if(permission != null)
//    			res = obj.isHasMorePermission()?res +"perms[\""+permission+"\"]":res +"perms["+permission+"]";
//    	}
//    	return "authc,"+res;
//    }
    
	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return this.getClass();
	}

	@Override
	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return false;
	}
	
	public void setFilterChainDefinitions(String filterChainDefinitions) {  
        this.filterChainDefinitions = filterChainDefinitions;  
    }
}
